package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import model.Casilla;
import model.Premio;


public class AdmPersistenciaPremio {
	
	private static final String  SELECT_PREMIOS="select codigo,monto,casillas_codigo,posicion from tpinteractivas.premios,tpinteractivas.premios_casillas_relacion "
			+ "where codigo=premios_codigo order by codigo,posicion";
	
	private static final String INSERT_PREMIO="INSERT INTO tpinteractivas.PREMIOS (CODIGO,MONTO) VALUES(?,?)";
	
	private static final String INSERT_PREMIO_RELACION = "INSERT INTO tpinteractivas.PREMIOS_CASILLAS_RELACION VALUES(?,?,?)";
	
	private static final String DELETE_PREMIO_RELACION = "DELETE FROM tpinteractivas.PREMIOS_CASILLAS_RELACION ";
	
	private static final String DELETE_PREMIO = "DELETE FROM tpinteractivas.PREMIOS";
	
	private static final String COUNT_PREMIOS = "SELECT COUNT(*) FROM tpinteractivas.PREMIOS";
	
	private static AdmPersistenciaPremio instancia;
	
	private AdmPersistenciaPremio() {

	}

	public static synchronized AdmPersistenciaPremio getInstancia() {
		if (instancia == null)
			instancia = new AdmPersistenciaPremio();
		return instancia;
	}
	
	
	public List<Premio> selectPremios() {
		List<Premio> premios=new ArrayList<Premio>();
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {	
			Statement s = con.createStatement();
			ResultSet result = s.executeQuery(SELECT_PREMIOS);
			Integer codigoPremio=-1;
			List<Integer> casillasId=new ArrayList<Integer>();
			Premio premio=null;
			while (result.next()) {
				if (codigoPremio!=-1 && codigoPremio!=result.getInt("codigo")){
					//cambiamos de premio hay que meter al premio que trabajabamos y buscar sus casillas
					List<Casilla> casillas= AdmPersistenciaCasilla.getInstancia().getCasillas(casillasId);	
					premio.setCasillas(casillas);
					premios.add(premio);
					//creo el nuevo premio
					codigoPremio=result.getInt("codigo");
					premio=new Premio(codigoPremio,result.getFloat("monto"));
					casillasId=new ArrayList<Integer>();
					casillasId.add(result.getInt("casillas_Codigo"));
					//limpio los ids
				} else if (codigoPremio==result.getInt("codigo")){
					//mismo premio, agrego la casilla
					casillasId.add(result.getInt("Casillas_Codigo"));	
				}	else{
					//creo el primer premio
					codigoPremio=result.getInt("codigo");
					premio=new Premio(codigoPremio,result.getFloat("monto"));
					casillasId=new ArrayList<Integer>();
					casillasId.add(result.getInt("Casillas_Codigo"));
				}
			}
			
			//Si no hago esto el ultimo premio me queda afuera
			if (codigoPremio!=-1){
				List<Casilla> casillas= AdmPersistenciaCasilla.getInstancia().getCasillas(casillasId);	
				premio.setCasillas(casillas);
				premios.add(premio);
			}
			
		
		} catch (Exception e) {
			System.out.println();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return premios;
	}

	public boolean insertarPremio(List<Casilla> casillasPremio, Float monto, int codigo) {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		boolean insert=false;
		try {
			PreparedStatement ps = con.prepareStatement(INSERT_PREMIO);
			ps.setInt(1, codigo);
			ps.setFloat(2, monto);
			ps.execute();

			for (int i=0;i<casillasPremio.size();i++) {
				
				ps = con.prepareStatement(INSERT_PREMIO_RELACION);
				ps.setInt(1, codigo);
				ps.setInt(2, casillasPremio.get(i).getCodigo());
				ps.setInt(3, i+1);
				ps.execute();
			}
			insert=true;
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return insert;
		
	}

	public boolean eliminarPremios() {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		boolean delete=false;
		try {
			Statement s = con.createStatement();
			delete = s.execute(DELETE_PREMIO_RELACION);
			delete = s.execute(DELETE_PREMIO);
	
			delete=true;
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return delete;
		
	}

	public Integer getCantidadPremios() {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Integer count=0;
		try {
			Statement s = con.createStatement();
			ResultSet rs=s.executeQuery(COUNT_PREMIOS);
			if (rs.next()){
				count=rs.getInt(1);
			}
			
		} catch (SQLException e) {
			System.out.println("Error buscando cantidad PREMIOS");
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return count;
	}
}
